﻿//========================================================= 
/**@file TestLinkerHelper.h
 * @brief 测试连接器辅助操作(对特定的接口赋值)
 * 
 * @date 2016-04-30   14:05:58
 * @author Zhyioo 
 * @version 1.0
 */ 
//--------------------------------------------------------- 
#ifndef _LIBZHOUYB_TESTLINKERHELPER_H_
#define _LIBZHOUYB_TESTLINKERHELPER_H_
//--------------------------------------------------------- 
#include "../TestFrame.h"
#include "../../../include/BaseDevice.h"
#include "../../../include/Device.h"
//--------------------------------------------------------- 
namespace zhou_yb {
namespace application {
namespace test {
//--------------------------------------------------------- 
/// 带命令控制的测试连接器
class TestLinkerHelper
{
protected:
    TestLinkerHelper() {}
public:
    /**
     * @brief 设置启动时交互的指令
     * @date 2016-04-30 14:21
     * 
     * @param [in] dev 需要操作的设备
     * @param [in] arg 配置项参数
     * - 参数
     *  - SendComand : hex [default:""] 连接成功后需要发送的控制指令
     *  - RecvCommand : hex [default:""] 发送控制指令后的回应码
     * .
     * @param [in] printer 文本输出器
     */
    static bool LinkCommand(IInteractiveTrans& dev, IStringArguments& arg, TextPrinter& printer)
    {
        string cmd;
        if(!arg.Get("SendCommand", cmd))
        {
            printer.TextPrint(TextPrinter::TextLogger, "没有找到[SendCommand],不需要发送数据");
            return true;
        }

        ByteBuilder cmdHex(8);
        DevCommand::FromAscii(cmd.c_str(), cmdHex);
        if(cmdHex.IsEmpty())
        {
            printer.TextPrint(TextPrinter::TextLogger, "发送数据为空,不需要发送");
            return true;
        }

        if(!dev.Write(cmdHex))
        {
            printer.TextPrint(TextPrinter::TextWarning, "发送数据失败");
            return false;
        }

        cmd = arg["RecvCommand"].To<string>();
        cmdHex.Clear();
        DevCommand::FromAscii(cmd.c_str(), cmdHex);

        if(cmdHex.IsEmpty())
        {
            printer.TextPrint(TextPrinter::TextLogger, "接收到空数据");
            return true;
        }

        // 比较接收的数据是否一致
        ByteBuilder recv(8);
        if(!dev.Read(recv))
        {
            printer.TextPrint(TextPrinter::TextLogger, "接收回应数据失败");
            return false;
        }
        if(!StringConvert::Compare(recv, cmdHex))
        {
            printer.TextPrint(TextPrinter::TextLogger, "回应数据不匹配");
            return false;
        }
        return true;
    }
    /**
     * @brief 设置超时时间和操作间隔
     * @date 2016-04-30 14:19
     * 
     * @param [in] dev 需要操作的设备
     * @param [in] arg 配置项参数 
     * - 参数
     *  - WaitTime : uint [default:DEV_WAIT_TIMEOUT] 读取的超时时间
     *  - OperatorInterval : uint [default:DEV_OPERATOR_INTERVAL] 每次读取的间隔
     * .
     * @param [in] printer 文本输出器
     */
    static bool LinkTimeoutBehavior(ITimeoutBehavior& dev, IStringArguments& arg, TextPrinter& printer)
    {
        string sVal;
        if(arg.Get("WaitTime", sVal))
            dev.SetWaitTimeout(ArgConvert::FromString<uint>(sVal));

        sVal = "";
        if(arg.Get("OperatorInterval", sVal))
            dev.SetOperatorInterval(ArgConvert::FromString<uint>(sVal));
        return true;
    }
};
//--------------------------------------------------------- 
} // namespace test 
} // namespace application 
} // namespace zhou_yb 
//--------------------------------------------------------- 
#endif // _LIBZHOUYB_TESTLINKERHELPER_H_
//========================================================= 